package com.weedsdream.app.colorplate

import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import kotlin.math.PI
import kotlin.math.atan2

/**根据颜色计算坐标*/
internal fun color2offset(color: Color): Offset {
    // 计算每种颜色对应的坐标贡献
    val xg1 = xg * color.green//这里的值是0-1f，是颜色占比而不是颜色值
    val xb1 = xb * color.blue
    val yr1 = yr * color.red
    val yg1 = yg * color.green
    val yb1 = yb * color.blue
    return Offset(xg1 + xb1, yr1 + yg1 + yb1)
}

/**根据坐标计算原始颜色(rgb至少一个参数为0)*/
internal fun offset2color(offset: Offset): Color {/*根据颜色转坐标反推得到多项式组
    * x=     xg*g+xb*b=x0
    * y=yr*r+yg*g+yb*b=y0
    * 条件补充：调色盘上每个扇区仅有两种情况：
    *   1.第三轴为0,则rgb必有一个为0
    *   2.第三轴点不为0,rgb实际有两个未知数*/
    // 反推计算式
    var r = 0f
    var g = 0f
    var b = 0f
    //使用第三轴计算补充参数
    atan2(offset.y, offset.x).let {//触摸点到原点连线与x轴的夹角
        if (it >= PI / 6 && it < PI * 5 / 6) {//蓝绿区域，r为0
            b = offset.y * SIN_R / yr - offset.x * SIN_G / xg
            g = offset.x / xg - COS_B * b / COS_G
        } else if (it >= PI * 5 / 6 || it < -PI / 2) {//红蓝区域，g为0
            b = offset.x / xb
            r = offset.y / yr - SIN_B * b / SIN_R
        } else {//红绿区域,b为0
            g = offset.x / xg
            r = offset.y / yr - SIN_G * g / SIN_R
        }
    }
    r *= 255
    g *= 255
    b *= 255
    return Color(r.toInt(), g.toInt(), b.toInt())
}

//避免浮点计算误差，将常计算数据提取为常量
private const val SQRT32 = 0.8660254f   // √3/2

//private const val COS_R = 0f          // r轴为270度=PI*9/6(水平向右顺时针,因为屏幕上y轴向下)
private const val SIN_R = -1f
private const val COS_G = SQRT32        // g轴为30度=PI/6
private const val SIN_G = 0.5f
private const val COS_B = -SQRT32       // b轴为150度=PI*5/6
private const val SIN_B = 0.5f

//每种颜色对x和y的贡献值，避免重复计算，在获取可用空间时计算一次。计算值为maxR*上面的六个常量
//private var xr = 0f COS_R被定义为0，此数据无用
private var xg = 0f
private var xb = 0f
private var yr = 0f
private var yg = 0f
private var yb = 0f

/**计算每种颜色对直角坐标的贡献
 * @param radius 最大可用半径*/
internal fun initXyRgb(radius: Float) {
    xg = radius * COS_G
    xb = radius * COS_B
    yr = radius * SIN_R
    yg = radius * SIN_G
    yb = radius * SIN_B
}